"""
作业1: 排序算法及其优化
"""


class Student(object):
    """学生类"""

    def __init__(self, name, age):
        # self.no = no
        self.name = name
        self.age = age

    """
    def __eq__(self, other):
        return self.no == other.no

    def __gt__(self, other):
        return self.name > other.name

    def __lt__(self, other):
        return self.name < other.name
    """

    def __repr__(self):
        return f'{self.name}: {self.age}'


# 练习1：实现两个有序列表的合并(归并排序的基础)
def merge(list1: list, list2: list) -> list:
    """将两个有序的列表合并成一个新的有序的列表"""
    pass


# Python中函数是“一等对象”
# 函数可以赋值给变量
# 函数可以作为函数的参数
# 函数可以函数的返回值
# 把函数设计成一等对象的语言也就是支持函数式编程的语言
def bubble_sort(alist, comp=None):
    """优化过的冒泡排序(搅拌排序)"""
    for i in range(len(alist) - 1):
        swapped = False
        for j in range(len(alist) - 1 - i):
            comp_result = comp(alist[j], alist[j + 1]) > 0 \
                if comp else alist[j] > alist[j + 1]
            if comp_result:
                alist[j], alist[j + 1] = alist[j + 1], alist[j]
                swapped = True
        if swapped:
            swapped = False
            for j in range(len(alist) - 2 - i, 0, -1):
                comp_result = comp(alist[j], alist[j - 1]) < 0 \
                    if comp else alist[j] < alist[j - 1]
                if comp_result:
                    alist[j], alist[j - 1] = alist[j - 1], alist[j]
                    swapped = True
        if not swapped:
            break


def compare(s1, s2) -> int:
    """
    比较两个学生对象(规则: 先比年龄, 年龄相同比名字)
    :param s1: 待比较的第一个学生
    :param s2: 待比较的第二个学生
    :return: 如果s1小于s2返回负数; 如果s1大于s2返回正数; 否则返回0
    """
    if s1.age == s2.age:
        return -1 if s1.name < s2.name else 1
    else:
        return s1.age - s2.age


"""
def compare2(s1, s2):
    if len(s1) == len(s2):
        return -1 if s1 < s2 else 1
    else:
        return len(s1) - len(s2)
"""


def main():
    # for code in range(0x4e00, 0x9fa6):
        # print(chr(code), end='')
    # print()
    # print(0x9fa6 - 0x4e00)
    list1 = [34, 25, 12, 99, 68, 77]
    bubble_sort(list1)
    print(list1)
    list2 = ['grape', 'pitaya', 'pear', 'waxberry', 'apple']
    # 一句话就能写完的函数可以直接使用Lambda函数(匿名函数)
    bubble_sort(list2)
    print(list2)
    # 根据字符串的长度给字符串排序
    bubble_sort(list2, lambda s1, s2: len(s1) - len(s2))
    print(list2)
    list3 = [
        Student('Wang Dachui', 25),
        Student('Luo Hao', 38),
        Student('Zhang Sanfeng', 120),
        Student('Bai Yuanfang', 25)
    ]
    bubble_sort(list3, compare)
    print(list3)


if __name__ == '__main__':
    main()
